﻿//using System.Collections.Generic;
//using UnityEngine;

//namespace Core.Experiment
//{
//    public class PathComponent : Core.Component, IAwake
//    {
//        public TileMap map { get; set; }

//        private AstarPathfinder2 finder;
        
//        public void Awake()
//        {
//            finder = new AstarPathfinder2();
//            finder.gridBase = this;
//        }

//        public override void Dispose()
//        {
//            if (IsDisposed) return;
//            base.Dispose();
//        }
//        public Vector2Int GetAnyEmptyPoint()
//        {
//            var size = map.Size;
//            var len = size.x * size.y;
//            int x, y;
//            while (true)
//            {
//                var index = UnityEngine.Random.Range(0, len);
//                x = index / size.x;
//                y = index % size.x;
//                if (TileMap.Grids[x, y].isWalkable == true)
//                {
//                    break;
//                }
//            }

//            return new Vector2Int(x, y);
//        }

//        public Vector2 GetAnyEmptyPos()
//        {
//            var size = map.Size;

//            var point = GetAnyEmptyPoint();
//            point -= new Vector2Int(size.x / 2, size.y / 2);

//            var pos = new Vector2(point.x + 0.5f, point.y + 0.5f);

//            return pos;
//        }

//        public Vector2Int GetPoint(Vector2 pos)
//        {
//            var size = map.Size;
//            var point = new Vector2Int(Mathf.FloorToInt(pos.x), Mathf.FloorToInt(pos.y));
//            point += new Vector2Int(size.x / 2, size.y / 2);
//            return point;
//        }

//        public Node GetNode(Vector2Int point)
//        {
//            return GetNode(point.x, point.y);
//        }
//        public Node GetNode(int x, int y)
//        {
//            var size = map.Size;

//            if (x < 0 || y < 0 || x > size.x || y > size.y)
//            {
//                return null;
//            }

//            return TileMap.Grids[x, y];
//        }

//        public void FindPath(ref List<Node> path, Vector2Int start_point, Vector2Int end_point)
//        {
//            finder.FindPath(ref path, GetNode(start_point), GetNode(end_point));
//        }

//        //public bool IsEmpty(Vector2Int point)
//        //{
//        //    return IsEmpty(point.x, point.y);
//        //}

//        //public bool IsEmpty(int x, int y)
//        //{
//        //    if (IsOutOfMap(x, y)) return false;

//        //    return TileMap.Grids[x, y] == 0;
//        //}

//        //public bool IsOutOfMap(Vector2Int point)
//        //{
//        //    return IsOutOfMap(point.x, point.y);
//        //}

//        //public bool IsOutOfMap(int x, int y)
//        //{
//        //    var size = map.Size;

//        //    if (x < 0 || y < 0 || x > size.x || y > size.y)
//        //    {
//        //        return true;
//        //    }

//        //    return false;
//        //}

//        //public Vector2Int GetMinFFromOpenList(Vector2Int start_point, Vector2Int end_point)
//        //{
//        //    var n = m_open_list[0];
//        //    var min_f = (n - start_point).sqrMagnitude + (n - end_point).sqrMagnitude;
//        //    int index = 0;
//        //    for (int i = 1; i < m_open_list.Count; i++)
//        //    {
//        //        n = m_open_list[i];
//        //        var f = (n - start_point).sqrMagnitude + (n - end_point).sqrMagnitude;
//        //        if (f < min_f)
//        //        {
//        //            min_f = f;
//        //            index = i;
//        //        }
//        //    }
//        //    return m_open_list[index];
//        //}

//        //public void CheckAround(Vector2Int point)
//        //{
//        //    for (int i = point.x - 1; i <= point.x + 1; i++)
//        //    {
//        //        for (int j = point.y - 1; j <= point.y + 1; j++)
//        //        {
//        //            if (IsEmpty(i, j) == false)
//        //            {
//        //                continue;
//        //            }

//        //            var p = new Vector2Int(i, j);

//        //            if (m_close_List.Contains(p) == true)
//        //            {
//        //                continue;
//        //            }

//        //            if (m_open_list.Contains(p) == false)
//        //            {
//        //                m_open_list.Add(p);
//        //            }
//        //            //else
//        //            //{

//        //            //}
//        //        }
//        //    }
//        //}

//        //private List<Vector2Int> m_close_List = new();
//        //private List<Vector2Int> m_open_list = new();
//        //public void FindPath(ref List<Vector2Int> points, Vector2 start_pos, Vector2 end_pos)
//        //{
//        //    points.Clear();

//        //    m_close_List.Clear();
//        //    m_open_list.Clear();

//        //    Vector2Int start_point = GetPoint(start_pos);
//        //    Vector2Int end_point = GetPoint(end_pos);

//        //    if (IsOutOfMap(start_point) || IsOutOfMap(end_point))
//        //    {
//        //        Debug.LogError($"Error!!! 起点或终点超出地图范围，无法寻路");
//        //        return;
//        //    }
//        //    m_open_list.Add(start_point);

//        //    while (m_open_list.Count != 0)
//        //    {
//        //        var point = GetMinFFromOpenList(start_point, end_point);
//        //        m_open_list.Remove(point);
//        //        m_close_List.Add(point);

//        //        if (point == end_point)
//        //        {
//        //            //Debug.Log()
//        //            break;
//        //        }

//        //        CheckAround(point);
//        //    }
//        //}

//    }
//}
